/*
 * @Description:
 * @Author: 张效玮2 yythis@163.com
 * @Date: 2025-08-11 10:05:29
 * @LastEditors: 张效玮2
 * @LastEditTime: 2025-08-15 17:41:38
 */
import { logoutApi } from "@@/apis/auth"
import { setToken as _setToken, getToken, removeToken } from "@@/utils/cache/cookies"
import { ElMessage } from "element-plus"
import { pinia } from "@/pinia"
import { resetRouter } from "@/router"
import { useSettingsStore } from "./settings"
import { useTagsViewStore } from "./tags-view"

export const useUserStore = defineStore("user", () => {
  const token = ref<string>(getToken() || "")

  const roles = ref<string[]>([])

  const username = ref<string>("")

  const tagsViewStore = useTagsViewStore()

  const settingsStore = useSettingsStore()

  // 设置 Token
  const setToken = (value: string) => {
    _setToken(value)
    token.value = value
  }

  const userInfo: any = ref()

  // 获取用户详情
  const getInfo = async () => {
    // const { data } = await getCurrentUserApi()
    // username.value = data.username
    // 验证返回的 roles 是否为一个非空数组，否则塞入一个没有任何作用的默认角色，防止路由守卫逻辑进入无限循环
    // roles.value = data.roles?.length > 0 ? data.roles : routerConfig.defaultRoles

    // 以下逻辑已不再使用，因为登录接口已经返回用户信息
    // username.value = "admin"
    // roles.value = routerConfig.defaultRoles
  }

  // 模拟角色变化
  const changeRoles = (role: string) => {
    const newToken = `token-${role}`
    token.value = newToken
    _setToken(newToken)
    // 用刷新页面代替重新登录
    location.reload()
  }

  // 登出
  const logout = async () => {
    try {
      // 调用后端退出登录接口
      const { code, message } = await logoutApi()

      // 判断接口返回状态
      if (code === 200) {
        ElMessage.success(message || "退出登录成功")
      } else {
        ElMessage.warning(message || "退出登录异常，但已清理本地状态")
      }
    } catch (error: any) {
      console.error("退出登录接口调用失败:", error)
      ElMessage.error(error?.message || "退出登录失败，但已清理本地状态")
    } finally {
      // 无论接口是否成功，都要清理前端状态
      removeToken()
      token.value = ""
      roles.value = []
      username.value = ""
      userInfo.value = null
      resetRouter()
      resetTagsView()
    }
  }

  // 重置 Token
  const resetToken = () => {
    removeToken()
    token.value = ""
    roles.value = []
  }

  // 重置 Visited Views 和 Cached Views
  const resetTagsView = () => {
    if (!settingsStore.cacheTagsView) {
      tagsViewStore.delAllVisitedViews()
      tagsViewStore.delAllCachedViews()
    }
  }

  return { token, roles, username, setToken, getInfo, changeRoles, logout, resetToken, userInfo }
})

/**
 * @description 在 SPA 应用中可用于在 pinia 实例被激活前使用 store
 * @description 在 SSR 应用中可用于在 setup 外使用 store
 */
export function useUserStoreOutside() {
  return useUserStore(pinia)
}
